﻿#include "mainwindow.h"
#include <QHBoxLayout>
#include <QEvent>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // 创建中心部件
    QWidget *centralWidget = new QWidget(this);
    this->setCentralWidget(centralWidget);

    // 创建按钮并设置文本
    button = new QPushButton("悬停我", this);
    button->setFixedSize(100, 50);

    // 创建标签并设置初始文本
    label = new QLabel("提示信息将在这里显示", this);
    label->setAlignment(Qt::AlignCenter);

    // 创建水平布局，将按钮和标签添加到布局中
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(button);
    layout->addWidget(label);

    // 将布局设置到中心部件
    centralWidget->setLayout(layout);

    // 为按钮安装事件过滤器
    button->installEventFilter(this);
}

MainWindow::~MainWindow()
{
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    // 判断被监视的对象是否是我们的按钮
    if (watched == button) {
        // 处理鼠标进入事件
        if (event->type() == QEvent::Enter) {
            label->setText("鼠标进入按钮");
            return true; // 表示事件已被处理
        }
        // 处理鼠标离开事件
        else if (event->type() == QEvent::Leave) {
            label->setText("鼠标离开按钮");
            return true; // 表示事件已被处理
        }
        // 处理鼠标按下事件
        else if (event->type() == QEvent::MouseButtonPress) {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
            if (mouseEvent->button() == Qt::LeftButton) {
                label->setText("左键按下按钮");
            } else if (mouseEvent->button() == Qt::RightButton) {
                label->setText("右键按下按钮");
            }
            return true; // 表示事件已被处理
        }
    }

    // 对于未处理的事件，调用基类的事件过滤器
    return QMainWindow::eventFilter(watched, event);
}


/*
事件过滤器的实际使用场景
在实际开发中，事件过滤器具有广泛的应用场景。以下是一些常见的使用场景：

全局键盘/鼠标事件监控：

如果你需要在整个应用程序范围内监控某些键盘或鼠标事件（例如，全局快捷键），可以在应用程序对象上安装事件过滤器。
例如，实现一个全局快捷键，用于快速显示或隐藏应用程序窗口。
自定义控件的行为：

当你创建自定义控件时，可能需要修改其默认的事件处理行为。通过事件过滤器，你可以添加或替换控件的特定事件响应。
例如，创建一个特定行为的按钮，当用户双击时触发不同的操作。
鼠标手势或拖放操作：

在处理复杂的鼠标手势或拖放操作时，可以使用事件过滤器捕获鼠标事件，从而在特定条件下执行自定义逻辑。
例如，在一个绘图应用中，通过事件过滤器实现鼠标拖动以绘制图形。
特定子控件事件处理：

有时你可能只对某个容器控件（如 QMainWindow、QWidget）的某些子控件的事件感兴趣，可以通过在这些子控件上安装事件过滤器来实现精细化控制。
例如，在一个复杂的表单中，你只对某个输入框的按键事件感兴趣，可以在该输入框上安装事件过滤器。
用户输入限制：

在某些输入控件中，你可能需要对用户输入进行特定的限制，例如只允许输入数字或特定格式的字符串。可以使用事件过滤器来拦截和处理输入事件，确保输入符合要求。
例如，实现一个仅允许输入数字的文本框。
跨平台兼容性处理：

在开发跨平台应用时，某些事件在不同平台上的表现可能有所不同。你可以通过事件过滤器来处理这些差异，使得应用在不同平台上具有一致的行为。
例如，在 Windows 和 macOS 上处理右键点击菜单的行为差异。
拦截窗口事件：

事件过滤器可以用来拦截窗口级别的事件，例如窗口移动、调整大小、最小化、最大化等，从而实现特定的窗口管理逻辑。
例如，实现一个自定义的窗口标题栏，用户拖动标题栏时可以移动窗口。
*/
